package com.rw.tool.util.basic;

import com.rw.tool.util.collection.CollectionUtil;

import java.util.List;

/**
 * 布尔工具类
 */
public class BooleanUtil {
    /**
     * 反转布尔值
     * 如果布尔值为null则返回null
     *
     * @param bool 布尔值
     * @return 反转之后的布尔值
     */
    public static Boolean negate(Boolean bool) {
        if (bool == null) {
            return null;
        }
        return !bool;
    }

    /**
     * 布尔值为true
     * 如果为null则返回false
     *
     * @param bool 布尔值
     * @return 是否为true
     */
    public static boolean isTrue(Boolean bool) {
        return Boolean.TRUE.equals(bool);
    }

    /**
     * 布尔值为false
     * 如果为null则返回true
     *
     * @param bool 布尔值
     * @return 是否为false
     */
    public static boolean isFalse(Boolean bool) {
        return !isTrue(bool);
    }

    /**
     * 与
     *
     * @return 把所有布尔值进行与运算
     */
    public static boolean and(Boolean... boolArray) {
        if (ArrayUtil.isEmpty(boolArray)) {
            throw new IllegalArgumentException("boolean array can not be empty!");
        }

        boolean result = true;
        for (Boolean bool : boolArray) {
            result = result && isTrue(bool);
        }

        return result;
    }

    /**
     * 与
     *
     * @return 把所有布尔值进行与运算
     */
    public static boolean and(List<Boolean> boolList) {
        if (CollectionUtil.isEmpty(boolList)) {
            throw new IllegalArgumentException("boolean list can not be empty!");
        }

        boolean result = true;
        for (Boolean bool : boolList) {
            result = result && isTrue(bool);
        }

        return result;
    }

    /**
     * 或
     *
     * @return 把所有布尔值进行或运算
     */
    public static boolean or(Boolean... boolArray) {
        if (ArrayUtil.isEmpty(boolArray)) {
            throw new IllegalArgumentException("boolean array can not be empty!");
        }

        boolean result = false;
        for (Boolean bool : boolArray) {
            result = result || isTrue(bool);
        }

        return result;
    }

    /**
     * 或
     *
     * @return 把所有布尔值进行或运算
     */
    public static boolean or(List<Boolean> boolList) {
        if (CollectionUtil.isEmpty(boolList)) {
            throw new IllegalArgumentException("boolean list can not be empty!");
        }

        boolean result = false;
        for (Boolean bool : boolList) {
            result = result || isTrue(bool);
        }

        return result;
    }

    /**
     * 异或
     *
     * @return 把所有布尔值进行异或运算
     */
    public static boolean xor(Boolean... boolArray) {
        if (ArrayUtil.isEmpty(boolArray)) {
            throw new IllegalArgumentException("boolean array can not be empty!");
        }

        boolean result = false;
        for (Boolean bool : boolArray) {
            result = result ^ isTrue(bool);
        }

        return result;
    }

    /**
     * 异或
     *
     * @return 把所有布尔值进行异或运算
     */
    public static boolean xor(List<Boolean> boolList) {
        if (CollectionUtil.isEmpty(boolList)) {
            throw new IllegalArgumentException("boolean list can not be empty!");
        }

        boolean result = false;
        for (Boolean bool : boolList) {
            result = result ^ isTrue(bool);
        }

        return result;
    }
}
